package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
	"strings"
)

func main() {
	f, _ := os.OpenFile("D:/xmglpt/test.go", os.O_RDWR, 6)
	defer f.Close()
	fmt.Println("success")

	//创建一个带有缓冲区(用户缓冲)的reader
	r := bufio.NewReader(f)
	for {
		buf, err := r.ReadBytes('\n') //读一行数据
		if err != nil && err == io.EOF {
			//输出文件结束表示符的行
			fmt.Println(string(buf))
			fmt.Println("reader end", err)
			return
		} else if err != nil {
			fmt.Println("reader err", err)
		}
		fmt.Println(string(buf))
	}
	fileCopy()
	readDir()
	cpFile()
}
func fileCopy() {
	//打开读文件
	file_read, err := os.Open("D:/xmglpt/test.go")
	if err != nil {
		fmt.Println("err", err)
	}
	defer file_read.Close()
	//创建写文件
	file_write, err := os.Create("D:/xmglpt/test1.go")
	if err != nil {
		fmt.Println("err", err)
	}
	defer file_write.Close()
	//从读文件中获取数据，放到缓冲区中
	buf := make([]byte, 1024*4)
	//循环从文件中获取数据，“原封不动的”写到文件中
	for {
		n, err := file_read.Read(buf)
		if err != nil && err == io.EOF {
			fmt.Println("success", n)
			return
		}
		file_write.Write(buf[:n]) //读多少，写多少
	}
}
func readDir() {

	fmt.Println("请输入待查询的目录")
	var path string = "D:/"
	//fmt.Scan(&path)

	//打开目录
	f, err := os.OpenFile(path, os.O_RDONLY, os.ModeDir)
	if err != nil {
		fmt.Println(err)
	}
	defer f.Close()

	//读取目录项
	info, err := f.Readdir(-1) // -1,读取目录中所有的目录项

	//遍历返回的切片
	for _, fileInfo := range info {
		if fileInfo.IsDir() {
			fmt.Println(fileInfo.Name(), "是一个目录")
		} else {
			fmt.Println(fileInfo.Name(), "是一个文件")
		}
	}
}

//拷贝指定格式文件到指定目录的操作
func cpFile() {
	sourcePath := "D:/program files/go/"
	destPath := "E:/liqing/"
	suff := ".md"
	//打开目录
	f, err := os.OpenFile(sourcePath, os.O_RDONLY, os.ModeDir)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer f.Close()

	//读取目录项
	info, err := f.Readdir(-1) // -1,读取目录中所有的目录项

	//遍历返回的切片
	for _, fileInfo := range info {
		if fileInfo.IsDir() {
			fmt.Println(fileInfo.Name(), "是一个目录")
		} else if strings.HasSuffix(fileInfo.Name(), suff) {
			fmt.Println(fileInfo.Name(), "是一个文件")
			//打开读文件
			file_read, err := os.Open(sourcePath + fileInfo.Name())
			if err != nil {
				fmt.Println("err", err)
				return
			}
			defer file_read.Close()
			//创建写文件
			file_write, err := os.Create(destPath + fileInfo.Name())
			if err != nil {
				fmt.Println("err", err)
				return
			}
			defer file_write.Close()
			//从读文件中获取数据，放到缓冲区中
			buf := make([]byte, 1024*4)
			//循环从文件中获取数据，“原封不动的”写到文件中
			for {
				n, err := file_read.Read(buf)
				if err != nil && err == io.EOF {
					fmt.Println("success", n)
					//return
					break
				}
				file_write.Write(buf[:n]) //读多少，写多少
			}
		}
	}
}

//递归拷贝,将指定目录下所有的特定格式文件拷贝到另一目录
func cpFile2() {
	sourcePath := "D:/program files/go/"
	destPath := "E:/liqing/"
	suff := ".md"

}
